// 初始化 Vuex 模块
export default ({
  namespaced: true,
  state: () => ({
    // 这里有六个固定属性
    // 读取本地 storage 的数据
    cart: JSON.parse(uni.getStorageSync('cartNum') || '[]')
  }),
  mutations: {
    // 添加到购物车
    addToCart(state, goods) {
      // 通过 goods_id 判断是否存在对应商品对象
      // 存在返回对应商品对象,不存在返回 undefind
      const result = state.cart.find((x) => x.goods_id === goods.goods_id)

      if (!result) {
        state.cart.push(goods)
      } else {
        result.goods_count += 1
      }

      this.commit('modulesCart/saveToStorage')
    },
    // 本地存储
    saveToStorage(state) {
      uni.setStorageSync('cartNum', JSON.stringify(state.cart))
    },
    // 更新商品勾选状态
    updateGoodsState(state, goods) {
      const findResult = state.cart.find(x => x.goods_id === goods.goods_id)
      if (findResult) {
        findResult.goods_state = goods.goods_state
        this.commit('modulesCart/saveToStorage')
      }
    },
    // 更新所有商品勾选状态
    updataAllCheckState(state,newState) {
      state.cart.forEach(item => item.goods_state = newState)
      this.commit('modulesCart/saveToStorage')
    },
    // 更新商品数量
    updateGoodsCount(state, goods) {
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      if (findResult) {
        findResult.goods_count = goods.goods_count
        this.commit('modulesCart/saveToStorage')
      }
    },
    // 删除商品
    removeGoodsById(state, goods_id) {
      state.cart = state.cart.filter(item => item.goods_id !== goods_id)
      this.commit('modulesCart/saveToStorage')
    }
  },
  getters: {
    // 计算所有商品总数
    total(state) {
      let c = 0
      // 循环遍历所有类别商品的数量
      state.cart.forEach(item => c += item.goods_count)
      return c
    },
    // 计算已勾选商品总数
    checkoutNum(state) {
      // 首先通过 filter 过滤所有选中的商品项
      // 再通过 reduce 方法进行累加
      return state.cart.filter(item => item.goods_state).reduce((total, item) => total += item.goods_count, 0)
    },
    // 计算商品总价
    checkoutPrice(state) {
      // toFiced: 保留两位小数
      return state.cart.filter(item => item.goods_state).reduce((total, item) => total += item.goods_count * item
        .goods_price, 0).toFixed(2)
    }
  }
})
